package iotwisp.base.util;

import java.util.List;

import org.springframework.util.StringUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.ValueFilter;

/**
 * 针对有Hibernate代理的类进行JSON转化
 * 
 * @author
 */
public class JSONUtils {

	protected final static ValueFilter fetchFilter = new ValueFilter() {
		@Override
		public Object process(Object source, String name, Object value) {
			if (value == null) {
				return null;
			}
			return BeanUtils.getProperty(value, value.getClass(), true);
		}
	};

	protected final static ValueFilter noFetchFilter = new ValueFilter() {
		@Override
		public Object process(Object source, String name, Object value) {
			if (value == null) {
				return null;
			}
			return BeanUtils.getProperty(value, value.getClass(), false);
		}
	};

	/**
	 * 将对象转换为JSON
	 * 
	 * @param o
	 * @return
	 */
	public static String toJSONString(Object o, boolean fetchProxyData) {
		if (fetchProxyData) {
			return JSON.toJSONString(o, fetchFilter);
		} else {
			return JSON.toJSONString(o, noFetchFilter);
		}

	}

	/**
	 * 将对象转换为JSON
	 * 
	 * @param o
	 * @return
	 */
	public static String toJSONString(Object o, boolean fetchProxyData, SerializerFeature... features) {
		if (fetchProxyData) {
			return JSON.toJSONString(o, fetchFilter, features);
		} else {
			return JSON.toJSONString(o, noFetchFilter, features);
		}
	}

	/**
	 * 将JSON转换为对象
	 * 
	 * @param json
	 * @param clazz
	 * @return
	 */
	public static <T> T parseObject(String json, Class<T> clazz) {
		if (StringUtils.isEmpty(json) || clazz == null) {
			return null;
		}
		return JSON.parseObject(json, clazz);
	}

	/**
	 * 将JSON转换为数组对象
	 * 
	 * @param json
	 * @param clazz
	 * @return
	 */
	public static <E> List<E> parseArray(String json, Class<E> clazz) {
		if (StringUtils.isEmpty(json) || clazz == null) {
			return null;
		}
		return JSON.parseArray(json, clazz);
	}

	/**
	 * 将从一个对象转换为另一个对象，相当于bean拷贝
	 * 
	 * @param clazz
	 * @return
	 */
	public static <T> T transform(Object o, Class<T> clazz) {
		return parseObject(toJSONString(o, false), clazz);
	}


	/**
	 * 将从一个对象转换为另一个对象，相当于bean拷贝
	 *
	 * @param clazz
	 * @return
	 */
	public static <T> T transform(Object o, boolean fetchProxyData, Class<T> clazz) {
		return parseObject(toJSONString(o, fetchProxyData), clazz);
	}

	/**
	 * 将从一个对象转换为另一个对象，相当于bean拷贝
	 * 
	 * @param clazz
	 * @return
	 */
	public static <T> List<T> transformArray(Object o, Class<T> clazz) {
		return parseArray(toJSONString(o, false), clazz);
	}

	/**
	 * 将从一个对象转换为另一个对象，相当于bean拷贝
	 * 
	 * @param clazz
	 * @return
	 */
	public static <T> List<T> transformArray(Object o, boolean fetchProxyData, Class<T> clazz) {
		return parseArray(toJSONString(o, fetchProxyData), clazz);
	}

}
